#ifndef MESH_SMOOTHING_H_
#define MESH_SMOOTHING_H_

#include <Mesh/_Func_.h>
#include <Mesh/libcell_iterator.h>

#ifdef __cplusplus
extern "C"{
#endif

// 0.5 -0.25
/**
 * 对给定的网格模型进行Taubin平滑处理。
 *
 * Taubin平滑是一种用于网格模型的平滑技术，它通过迭代应用两种不同的松弛因子来减少网格的噪声并保持其整体形状。
 *
 * @param m 指向要平滑的网格模型的指针。
 * @param include_bound 指定是否对边界顶点进行平滑处理，1表示添加边界，0表示不添加边界。
 * @param l1 第一个松弛因子，用于收缩网格。
 * @param l2 第二个松弛因子，用于膨胀网格。
 * @param iter 迭代次数，表示平滑过程将重复的次数。
 *
 * 注意：l1和l2的值通常应该选择在(-1, 1)范围内，并且l1应该小于l2的绝对值，以确保平滑过程的稳定性。
 *       include_bound参数允许用户选择是否对网格的边界顶点进行同样的平滑处理，这取决于具体的应用场景和需求。
 */
void mesh_smoothing_taubin(Mesh*m,int include_bound,double l1,double l2,int iter);

//这个版本代码简单，速度很慢
void mesh_smoothing_taubin_node(Node* n,double l1,double l2,int iter);
// 这个版本速度快，平滑链表n里面的顶点。
void mesh_smoothing_taubin_noden(Node* n,
    double l1,double l2,int iter);

// 不应该计算力的传播，应该计算功的传播
//
// 应该用拉普拉斯平滑力的功

// 适合并行计算的计算曲面距离
// 返回除了sources_v以外点到sources_v的距离图

double* compute_once_surface_dis_map(Mesh* m,
    Node * sources_v);

//  法向自动计算,不要再建内存储存cell法向，反而会慢
//@impact_scope(影响范围)，也就是这些点被移动后，周围几层拓扑邻接点收到平滑影响
// nodev的traits属性储存了力度值
//
void simple_carving_smooth(Node* nodev,
    int impact_scope,int iter_num );


#ifdef __cplusplus
}
#endif

#endif
